ONNX(Open Neural Network Exchange)是一套開放神經網路交換格式,由 Facebook、微軟結盟推出, 並獲得 Intel、AMD、ARM、IBM、華為和高通/聯發科晶片廠商支持加入 。 神經網路框架格式間的互通性, 讓不同標準的深度學習模型可以互相轉換,加快AI人工智慧的發展。目前有許多AI人工智慧Model,如 Google 的 TensorFlow、Facebook 的 Caffe2/PyTorch、微軟的CNTK、亞馬遜的 MXNet 等等。 為什麼需要框架之間有互通性?不同框架有不同優勢,因為某框架 表現比較好,你可以用它訓練了一個神經網路,然後用另一個框架來執行。 Facebook 和微軟合作就是為了解決這個問題。根據雙方透露的情況,未來CNTK、Caffe2 和 PyTorch 都會支援新的互通格式 ONNX。 但TensorFlow 目前是業界主流,已建立自己整個生態架構,並沒有要支援 ONNX,這是最大的缺憾。
微軟於2018/3/7公佈AI平台Windows Machine Learning (Windows ML),並預告將整合於春天釋出。微軟表示,Windows ML可分析Windows 10裝置上的機器學習模型,讓開發人員在其Windows 10 中使用預先訓練好的機器學習模型。 從Visual Studio Preview 15.7起,開發人員將可在UWP (Universal Windows Platform) 專案加入ONNX檔。意謂著未來在Python上訓練好的機器學習的模型,我們可以開發在Windows 10上面使用,滿足邊緣運算的應用。
AWS、Google及Azure是世界三大雲端運算平台,目前雲端上的機器學習都有提供更簡單的方式,滿足AI全民化的需求。舉微軟例子而言,Azure ML 可以輕易地從機器學習入手。上傳相關圖片,就可以深度學習,然後形成WebService API,提供各種應用程式存取。然而不是每個應用都可以連上網存取WebService,有時候需要的是邊緣運算。微軟提供一個輸出ONNX格式。我們就可以進一步在其它Python AI程式上做開發或使用微軟VS.Net 引入ONNX,開發成Windows 10可以執行的應用軟體。同樣的AWS雲端也是可以如此做,這就是ONNX標準格式的優點,值得推廣。
在AI的時代,對微軟而言有強烈的危機感,所以趕緊推出ML.Net來滿足開發人員對AI的需求 (如上圖所示)。 ML.NET 是免費的跨平台開放原始碼機器學習服務架構,可供您建置量身打造的機器學習解決方案,以及與 .NET 應用程式整合。 從圖示可以看出ML.NET 是支持分類(例如文本分類、情感分析)、迴歸(例如預測、價格預估)等機器學習,而不是深度學習。但ML.NET 是一個框架,它可以擴展將 TensorFlow、Accord.NET 和 CNTK 這樣的AI深度機器學習庫加進去,使得原本廣大使用C#的開發人員,可以花比較少的轉換學習時間,就搖身一變為全方位AI開發程式人員。
雖然TensorFlow官方不支援ONNX,但有心人士還是想辦法讓TensorFlow可以輸出ONNX,其中在GitHub上的TF2ONNX,就可以將TensorFlow models to ONNX models,但還是不能將ONNX格式引入TensorFlow。即使TensorFlow不支援ONNX,在邊緣運算方面,除了用TF2ONNX輸出給Windows10使用,還是可以使用TensorFlow+PyQT做成跨平台應用程式,滿足AI時代邊緣運算與物聯網IoT的整合應用。若對PyQT有興趣的人,可以參考我的另一篇文章:Qt Creator 4.7.0 Released
在以往整合Python AI應用與其它程式(C#/Java/PHP)等等,我們習慣用WebService(Web API)來做溝通橋樑。尤其是Python重新訓練的Model,若透過Web API,就不用像ONNX這樣,需輸出再引入程式及其它程式編譯的動作。但WebAPI比較不適合離線或即時的邊緣運算來使用,這時候ONNX格式的優點就顯現出來。但ONNX還是有一些缺點,比方說很多時候新版本的AI開發工具推出,但ONNX格式並沒有即時支援,在使用上大家會有比較大的疑慮。另一方面也是老大哥Google的TensorFlow不支援ONNX,而市面上超過一半的人工智慧應用開發者,還是選擇TensorFlow為主,期待有一天Google想通,能夠主動加入支援ONNX格式。
補充文章(2019/01/18):這陣子研究TensorFlow Serving的心得,開發者可以使用 TensorFlow 訓練模型,然後用 TensorFlow Serving 的 API 處理來自客戶端的數據輸入,類似Web API功能,訓練好的AI Model直接使用,不必再用Python框架--Flask/Django寫成Web API。
註1: (2018/09/14)微軟釋出ML.NET 0.5,開始支援TensorFlow,開發者可以在ML.NET中直接使用已經訓練好的TensorFlow模型,等於是直接支援TensorFlow格式。
註2: (2018/10/08)微軟釋出ML.NET 0.6,開發者可以在ML.NET中直接使用已經訓練好的ONNX模型。
註3: (2019/01/10)微軟釋出ML.NET 0.9,支援CUDA 10.0的GPU,以提高ONNX模型執行的能力,目前只能在64bit Windows上運作,之後將支援Linux/Mac。
AI大數據部落格: http://papayuan.pixnet.net